home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP10 / POPMENU.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-01  |  4.6 KB  |  132 lines

  1. /*----------------------------------------
  2.    POPMENU.C -- Popup Menu Demonstration
  3.                 (c) Charles Petzold, 1996
  4.   ----------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "popmenu.h"
  8.  
  9. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  10.  
  11. char      szAppName[] = "PopMenu" ;
  12. HINSTANCE hInst ;
  13.  
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  15.                     PSTR szCmdLine, int iCmdShow)
  16.      {
  17.      HWND       hwnd ;
  18.      MSG        msg ;
  19.      WNDCLASSEX wndclass ;
  20.  
  21.      wndclass.cbSize        = sizeof (wndclass) ;
  22.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  23.      wndclass.lpfnWndProc   = WndProc ;
  24.      wndclass.cbClsExtra    = 0 ;
  25.      wndclass.cbWndExtra    = 0 ;
  26.      wndclass.hInstance     = hInstance ;
  27.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  28.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  29.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  30.      wndclass.lpszMenuName  = NULL ;
  31.      wndclass.lpszClassName = szAppName ;
  32.      wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
  33.  
  34.      RegisterClassEx (&wndclass) ;
  35.  
  36.      hInst = hInstance ;
  37.  
  38.      hwnd = CreateWindow (szAppName, "Popup Menu Demonstration",
  39.                           WS_OVERLAPPEDWINDOW,
  40.                           CW_USEDEFAULT, CW_USEDEFAULT,
  41.                           CW_USEDEFAULT, CW_USEDEFAULT,
  42.                           NULL, NULL, hInstance, NULL) ;
  43.  
  44.      ShowWindow (hwnd, iCmdShow) ;
  45.      UpdateWindow (hwnd) ;
  46.  
  47.      while (GetMessage (&msg, NULL, 0, 0))
  48.           {
  49.           TranslateMessage (&msg) ;
  50.           DispatchMessage (&msg) ;
  51.           }
  52.      return msg.wParam ;
  53.      }
  54.  
  55. LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
  56.      {
  57.      static HMENU hMenu ;
  58.      static int   iColorID[5] = { WHITE_BRUSH,  LTGRAY_BRUSH, GRAY_BRUSH,
  59.                                   DKGRAY_BRUSH, BLACK_BRUSH } ;
  60.      static int   iSelection = IDM_WHITE ;
  61.      POINT        point ;
  62.  
  63.      switch (iMsg)
  64.           {
  65.           case WM_CREATE :
  66.                hMenu = LoadMenu (hInst, szAppName) ;
  67.                hMenu = GetSubMenu (hMenu, 0) ;
  68.                return 0 ;
  69.  
  70.           case WM_RBUTTONDOWN :
  71.                point.x = LOWORD (lParam) ;
  72.                point.y = HIWORD (lParam) ;
  73.                ClientToScreen (hwnd, &point) ;
  74.  
  75.                TrackPopupMenu (hMenu, 0, point.x, point.y, 0, hwnd, NULL) ;
  76.                return 0 ;
  77.  
  78.           case WM_COMMAND :
  79.                switch (LOWORD (wParam))
  80.                     {
  81.                     case IDM_NEW :
  82.                     case IDM_OPEN :
  83.                     case IDM_SAVE :
  84.                     case IDM_SAVEAS :
  85.                     case IDM_UNDO :
  86.                     case IDM_CUT :
  87.                     case IDM_COPY :
  88.                     case IDM_PASTE :
  89.                     case IDM_DEL :
  90.                          MessageBeep (0) ;
  91.                          return 0 ;
  92.  
  93.                     case IDM_WHITE :          // Note: Logic below
  94.                     case IDM_LTGRAY :         //   assumes that IDM_WHITE
  95.                     case IDM_GRAY :           //   through IDM_BLACK are
  96.                     case IDM_DKGRAY :         //   consecutive numbers in
  97.                     case IDM_BLACK :          //   the order shown here.
  98.  
  99.                          CheckMenuItem (hMenu, iSelection, MF_UNCHECKED) ;
  100.                          iSelection = LOWORD (wParam) ;
  101.                          CheckMenuItem (hMenu, iSelection, MF_CHECKED) ;
  102.      
  103.                          SetClassLong (hwnd, GCL_HBRBACKGROUND,
  104.                               (LONG) GetStockObject 
  105.                                  (iColorID[LOWORD (wParam) - IDM_WHITE])) ;
  106.  
  107.                          InvalidateRect (hwnd, NULL, TRUE) ;
  108.                          return 0 ;
  109.  
  110.                     case IDM_ABOUT :
  111.                          MessageBox (hwnd, "Popup Menu Demonstration Program.",
  112.                                      szAppName, MB_ICONINFORMATION | MB_OK) ;
  113.                          return 0 ;
  114.  
  115.                     case IDM_EXIT :
  116.                          SendMessage (hwnd, WM_CLOSE, 0, 0) ;
  117.                          return 0 ;
  118.  
  119.                     case IDM_HELP :
  120.                          MessageBox (hwnd, "Help not yet implemented!",
  121.                                      szAppName, MB_ICONEXCLAMATION | MB_OK) ;
  122.                          return 0 ;
  123.                     }
  124.                break ;
  125.  
  126.           case WM_DESTROY :
  127.                PostQuitMessage (0) ;
  128.                return 0 ;
  129.           }
  130.      return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
  131.      }
  132.